{
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Pytorch Linear Regression"
      ],
      "metadata": {
        "nteract": {
          "transient": {
            "deleting": false
          }
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "\n",
        "import yfinance as yf\n",
        "yf.pdr_override()"
      ],
      "outputs": [],
      "execution_count": 1,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:37.769Z",
          "iopub.execute_input": "2022-07-21T00:12:37.773Z",
          "iopub.status.idle": "2022-07-21T00:12:37.872Z",
          "shell.execute_reply": "2022-07-21T00:12:37.898Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# input\n",
        "symbol = 'AMD'\n",
        "start = '2014-01-01'\n",
        "end = '2018-08-27'\n",
        "\n",
        "# Read data \n",
        "dataset = yf.download(symbol,start,end)\n",
        "\n",
        "# View Columns\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[*********************100%***********************]  1 of 1 completed\n"
          ]
        },
        {
          "output_type": "execute_result",
          "execution_count": 2,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume\nDate                                                    \n2014-01-02  3.85  3.98  3.84   3.95       3.95  20548400\n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200\n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300\n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100\n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-02</th>\n      <td>3.85</td>\n      <td>3.98</td>\n      <td>3.84</td>\n      <td>3.95</td>\n      <td>3.95</td>\n      <td>20548400</td>\n    </tr>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 2,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:37.879Z",
          "iopub.execute_input": "2022-07-21T00:12:37.884Z",
          "iopub.status.idle": "2022-07-21T00:12:38.500Z",
          "shell.execute_reply": "2022-07-21T00:12:38.620Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset['Increase_Decrease'] = np.where(dataset['Volume'].shift(-1) > dataset['Volume'],1,0)\n",
        "dataset['Buy_Sell_on_Open'] = np.where(dataset['Open'].shift(-1) > dataset['Open'],1,0)\n",
        "dataset['Buy_Sell'] = np.where(dataset['Adj Close'].shift(-1) > dataset['Adj Close'],1,0)\n",
        "dataset['Returns'] = dataset['Adj Close'].pct_change()\n",
        "dataset = dataset.dropna()"
      ],
      "outputs": [],
      "execution_count": 3,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:38.507Z",
          "iopub.execute_input": "2022-07-21T00:12:38.511Z",
          "iopub.status.idle": "2022-07-21T00:12:38.520Z",
          "shell.execute_reply": "2022-07-21T00:12:38.624Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 4,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume  Increase_Decrease  \\\nDate                                                                          \n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200                  1   \n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300                  1   \n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100                  0   \n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700                  0   \n2014-01-09  4.20  4.23  4.05   4.09       4.09  30667600                  0   \n\n            Buy_Sell_on_Open  Buy_Sell   Returns  \nDate                                              \n2014-01-03                 1         1  0.012658  \n2014-01-06                 1         1  0.032500  \n2014-01-07                 1         0  0.012106  \n2014-01-08                 0         0  0.000000  \n2014-01-09                 0         1 -0.021531  ",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n      <th>Increase_Decrease</th>\n      <th>Buy_Sell_on_Open</th>\n      <th>Buy_Sell</th>\n      <th>Returns</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.012658</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.032500</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0.012106</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>2014-01-09</th>\n      <td>4.20</td>\n      <td>4.23</td>\n      <td>4.05</td>\n      <td>4.09</td>\n      <td>4.09</td>\n      <td>30667600</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>-0.021531</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 4,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:38.526Z",
          "iopub.execute_input": "2022-07-21T00:12:38.531Z",
          "iopub.status.idle": "2022-07-21T00:12:38.542Z",
          "shell.execute_reply": "2022-07-21T00:12:38.627Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.tail()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 5,
          "data": {
            "text/plain": "                 Open   High        Low      Close  Adj Close     Volume  \\\nDate                                                                       \n2018-08-20  19.790001  20.08  19.350000  19.980000  19.980000   62983200   \n2018-08-21  19.980000  20.42  19.860001  20.400000  20.400000   55629000   \n2018-08-22  20.280001  20.92  20.209999  20.900000  20.900000   62002700   \n2018-08-23  21.190001  22.32  21.139999  22.290001  22.290001  113444100   \n2018-08-24  22.910000  24.00  22.670000  23.980000  23.980000  164328200   \n\n            Increase_Decrease  Buy_Sell_on_Open  Buy_Sell   Returns  \nDate                                                                 \n2018-08-20                  0                 1         1  0.010622  \n2018-08-21                  1                 1         1  0.021021  \n2018-08-22                  1                 1         1  0.024510  \n2018-08-23                  1                 1         1  0.066507  \n2018-08-24                  0                 0         0  0.075819  ",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n      <th>Increase_Decrease</th>\n      <th>Buy_Sell_on_Open</th>\n      <th>Buy_Sell</th>\n      <th>Returns</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2018-08-20</th>\n      <td>19.790001</td>\n      <td>20.08</td>\n      <td>19.350000</td>\n      <td>19.980000</td>\n      <td>19.980000</td>\n      <td>62983200</td>\n      <td>0</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.010622</td>\n    </tr>\n    <tr>\n      <th>2018-08-21</th>\n      <td>19.980000</td>\n      <td>20.42</td>\n      <td>19.860001</td>\n      <td>20.400000</td>\n      <td>20.400000</td>\n      <td>55629000</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.021021</td>\n    </tr>\n    <tr>\n      <th>2018-08-22</th>\n      <td>20.280001</td>\n      <td>20.92</td>\n      <td>20.209999</td>\n      <td>20.900000</td>\n      <td>20.900000</td>\n      <td>62002700</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.024510</td>\n    </tr>\n    <tr>\n      <th>2018-08-23</th>\n      <td>21.190001</td>\n      <td>22.32</td>\n      <td>21.139999</td>\n      <td>22.290001</td>\n      <td>22.290001</td>\n      <td>113444100</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.066507</td>\n    </tr>\n    <tr>\n      <th>2018-08-24</th>\n      <td>22.910000</td>\n      <td>24.00</td>\n      <td>22.670000</td>\n      <td>23.980000</td>\n      <td>23.980000</td>\n      <td>164328200</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0.075819</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 5,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "shell.execute_reply": "2022-07-21T00:12:38.630Z",
          "iopub.status.busy": "2022-07-21T00:12:38.550Z",
          "iopub.execute_input": "2022-07-21T00:12:38.555Z",
          "iopub.status.idle": "2022-07-21T00:12:38.567Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 6,
          "data": {
            "text/plain": "(1170, 10)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 6,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:38.574Z",
          "iopub.execute_input": "2022-07-21T00:12:38.579Z",
          "iopub.status.idle": "2022-07-21T00:12:38.589Z",
          "shell.execute_reply": "2022-07-21T00:12:38.632Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import torch\n",
        "import torch.nn as nn\n",
        "\n",
        "X = torch.Tensor(dataset[['Open']].values)\n",
        "y = torch.Tensor(dataset[['Adj Close']].values)"
      ],
      "outputs": [],
      "execution_count": 7,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:38.595Z",
          "iopub.execute_input": "2022-07-21T00:12:38.599Z",
          "iopub.status.idle": "2022-07-21T00:12:39.470Z",
          "shell.execute_reply": "2022-07-21T00:12:39.646Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "x_train = np.array(X, dtype=np.float32)\n",
        "x_train.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 8,
          "data": {
            "text/plain": "(1170, 1)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 8,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.477Z",
          "iopub.execute_input": "2022-07-21T00:12:39.482Z",
          "iopub.status.idle": "2022-07-21T00:12:39.491Z",
          "shell.execute_reply": "2022-07-21T00:12:39.649Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "y_train = np.array(y, dtype=np.float32)\n",
        "y_train.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 9,
          "data": {
            "text/plain": "(1170, 1)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 9,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.498Z",
          "iopub.execute_input": "2022-07-21T00:12:39.503Z",
          "iopub.status.idle": "2022-07-21T00:12:39.513Z",
          "shell.execute_reply": "2022-07-21T00:12:39.652Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "class LinearRegressionModel(nn.Module):\n",
        "    def __init__(self, input_dim, output_dim):\n",
        "        super(LinearRegressionModel, self).__init__()\n",
        "        self.linear = nn.Linear(input_dim, output_dim)  \n",
        "\n",
        "    def forward(self, x):\n",
        "        out = self.linear(x)\n",
        "        return out"
      ],
      "outputs": [],
      "execution_count": 10,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.519Z",
          "iopub.execute_input": "2022-07-21T00:12:39.523Z",
          "iopub.status.idle": "2022-07-21T00:12:39.530Z",
          "shell.execute_reply": "2022-07-21T00:12:39.656Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "input_dim = 1\n",
        "output_dim = 1\n",
        "\n",
        "model = LinearRegressionModel(input_dim, output_dim)"
      ],
      "outputs": [],
      "execution_count": 11,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.536Z",
          "iopub.execute_input": "2022-07-21T00:12:39.541Z",
          "iopub.status.idle": "2022-07-21T00:12:39.549Z",
          "shell.execute_reply": "2022-07-21T00:12:39.659Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "criterion = nn.MSELoss()"
      ],
      "outputs": [],
      "execution_count": 12,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.556Z",
          "iopub.execute_input": "2022-07-21T00:12:39.560Z",
          "iopub.status.idle": "2022-07-21T00:12:39.569Z",
          "shell.execute_reply": "2022-07-21T00:12:39.663Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "learning_rate = 0.01\n",
        "\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
      ],
      "outputs": [],
      "execution_count": 13,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.578Z",
          "iopub.execute_input": "2022-07-21T00:12:39.584Z",
          "iopub.status.idle": "2022-07-21T00:12:39.591Z",
          "shell.execute_reply": "2022-07-21T00:12:39.666Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "epochs = 100"
      ],
      "outputs": [],
      "execution_count": 14,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.597Z",
          "iopub.execute_input": "2022-07-21T00:12:39.603Z",
          "iopub.status.idle": "2022-07-21T00:12:39.613Z",
          "shell.execute_reply": "2022-07-21T00:12:39.670Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "for epoch in range(epochs):\n",
        "    epoch += 1\n",
        "    # Convert numpy array to torch Variable\n",
        "    inputs = torch.from_numpy(x_train).requires_grad_()\n",
        "    labels = torch.from_numpy(y_train)\n",
        "\n",
        "    # Clear gradients w.r.t. parameters\n",
        "    optimizer.zero_grad() \n",
        "\n",
        "    # Forward to get output\n",
        "    outputs = model(inputs)\n",
        "\n",
        "    # Calculate Loss\n",
        "    loss = criterion(outputs, labels)\n",
        "\n",
        "    # Getting gradients w.r.t. parameters\n",
        "    loss.backward()\n",
        "\n",
        "    # Updating parameters\n",
        "    optimizer.step()\n",
        "\n",
        "    print('epoch {}, loss {}'.format(epoch, loss.item()))"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "epoch 1, loss 0.5020267367362976\n",
            "epoch 2, loss 0.25242939591407776\n",
            "epoch 3, loss 0.19715286791324615\n",
            "epoch 4, loss 0.1839243620634079\n",
            "epoch 5, loss 0.17980721592903137\n",
            "epoch 6, loss 0.17767709493637085\n",
            "epoch 7, loss 0.17599248886108398\n",
            "epoch 8, loss 0.1744200885295868\n",
            "epoch 9, loss 0.1728873997926712\n",
            "epoch 10, loss 0.1713785082101822\n",
            "epoch 11, loss 0.16988997161388397\n",
            "epoch 12, loss 0.1684207171201706\n",
            "epoch 13, loss 0.1669703722000122\n",
            "epoch 14, loss 0.16553857922554016\n",
            "epoch 15, loss 0.16412518918514252\n",
            "epoch 16, loss 0.1627298891544342\n",
            "epoch 17, loss 0.1613524705171585\n",
            "epoch 18, loss 0.1599927842617035\n",
            "epoch 19, loss 0.1586504876613617\n",
            "epoch 20, loss 0.15732528269290924\n",
            "epoch 21, loss 0.1560172289609909\n",
            "epoch 22, loss 0.1547258198261261\n",
            "epoch 23, loss 0.1534510999917984\n",
            "epoch 24, loss 0.15219268202781677\n",
            "epoch 25, loss 0.1509503722190857\n",
            "epoch 26, loss 0.14972400665283203\n",
            "epoch 27, loss 0.1485133171081543\n",
            "epoch 28, loss 0.14731822907924652\n",
            "epoch 29, loss 0.14613832533359528\n",
            "epoch 30, loss 0.14497369527816772\n",
            "epoch 31, loss 0.1438239961862564\n",
            "epoch 32, loss 0.14268890023231506\n",
            "epoch 33, loss 0.14156857132911682\n",
            "epoch 34, loss 0.14046242833137512\n",
            "epoch 35, loss 0.13937059044837952\n",
            "epoch 36, loss 0.13829267024993896\n",
            "epoch 37, loss 0.1372285634279251\n",
            "epoch 38, loss 0.136178120970726\n",
            "epoch 39, loss 0.13514119386672974\n",
            "epoch 40, loss 0.1341174989938736\n",
            "epoch 41, loss 0.13310690224170685\n",
            "epoch 42, loss 0.13210932910442352\n",
            "epoch 43, loss 0.13112454116344452\n",
            "epoch 44, loss 0.1301523745059967\n",
            "epoch 45, loss 0.12919269502162933\n",
            "epoch 46, loss 0.1282452642917633\n",
            "epoch 47, loss 0.12731002271175385\n",
            "epoch 48, loss 0.12638674676418304\n",
            "epoch 49, loss 0.12547531723976135\n",
            "epoch 50, loss 0.12457560002803802\n",
            "epoch 51, loss 0.12368734925985336\n",
            "epoch 52, loss 0.12281060218811035\n",
            "epoch 53, loss 0.12194497883319855\n",
            "epoch 54, loss 0.12109047919511795\n",
            "epoch 55, loss 0.1202469915151596\n",
            "epoch 56, loss 0.11941429227590561\n",
            "epoch 57, loss 0.1185922771692276\n",
            "epoch 58, loss 0.11778078973293304\n",
            "epoch 59, loss 0.11697962880134583\n",
            "epoch 60, loss 0.11618884652853012\n",
            "epoch 61, loss 0.11540816724300385\n",
            "epoch 62, loss 0.11463752388954163\n",
            "epoch 63, loss 0.11387672275304794\n",
            "epoch 64, loss 0.11312571167945862\n",
            "epoch 65, loss 0.11238440126180649\n",
            "epoch 66, loss 0.11165245622396469\n",
            "epoch 67, loss 0.11092997342348099\n",
            "epoch 68, loss 0.1102166622877121\n",
            "epoch 69, loss 0.10951258987188339\n",
            "epoch 70, loss 0.10881751775741577\n",
            "epoch 71, loss 0.10813140124082565\n",
            "epoch 72, loss 0.10745398700237274\n",
            "epoch 73, loss 0.1067853644490242\n",
            "epoch 74, loss 0.10612522810697556\n",
            "epoch 75, loss 0.1054735779762268\n",
            "epoch 76, loss 0.104830302298069\n",
            "epoch 77, loss 0.10419531166553497\n",
            "epoch 78, loss 0.10356834530830383\n",
            "epoch 79, loss 0.10294948518276215\n",
            "epoch 80, loss 0.10233858972787857\n",
            "epoch 81, loss 0.10173548758029938\n",
            "epoch 82, loss 0.10114015638828278\n",
            "epoch 83, loss 0.10055241733789444\n",
            "epoch 84, loss 0.09997223317623138\n",
            "epoch 85, loss 0.09939948469400406\n",
            "epoch 86, loss 0.0988340824842453\n",
            "epoch 87, loss 0.09827595204114914\n",
            "epoch 88, loss 0.09772491455078125\n",
            "epoch 89, loss 0.0971810519695282\n",
            "epoch 90, loss 0.09664404392242432\n",
            "epoch 91, loss 0.09611400216817856\n",
            "epoch 92, loss 0.09559071063995361\n",
            "epoch 93, loss 0.0950741246342659\n",
            "epoch 94, loss 0.09456422924995422\n",
            "epoch 95, loss 0.09406080842018127\n",
            "epoch 96, loss 0.09356381744146347\n",
            "epoch 97, loss 0.093073271214962\n",
            "epoch 98, loss 0.09258896112442017\n",
            "epoch 99, loss 0.09211090952157974\n",
            "epoch 100, loss 0.0916389599442482\n"
          ]
        }
      ],
      "execution_count": 15,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:12:39.620Z",
          "iopub.execute_input": "2022-07-21T00:12:39.625Z",
          "shell.execute_reply": "2022-07-21T00:12:39.673Z",
          "iopub.status.idle": "2022-07-21T00:12:39.679Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()\n",
        "predicted"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 16,
          "data": {
            "text/plain": "array([[ 3.7770548],\n       [ 3.8080235],\n       [ 3.993832 ],\n       ...,\n       [20.60309  ],\n       [21.542458 ],\n       [23.317965 ]], dtype=float32)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 16,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:13:40.315Z",
          "iopub.execute_input": "2022-07-21T00:13:40.322Z",
          "iopub.status.idle": "2022-07-21T00:13:40.337Z",
          "shell.execute_reply": "2022-07-21T00:13:40.344Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "y_train"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 17,
          "data": {
            "text/plain": "array([[ 4.  ],\n       [ 4.13],\n       [ 4.18],\n       ...,\n       [20.9 ],\n       [22.29],\n       [23.98]], dtype=float32)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 17,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:13:41.799Z",
          "iopub.execute_input": "2022-07-21T00:13:41.807Z",
          "iopub.status.idle": "2022-07-21T00:13:41.820Z",
          "shell.execute_reply": "2022-07-21T00:13:41.831Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.clf()\n",
        "\n",
        "# Get predictions\n",
        "predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()\n",
        "\n",
        "# Plot true data\n",
        "plt.plot(x_train, y_train, 'go', label='True data', alpha=0.5)\n",
        "\n",
        "# Plot predictions\n",
        "plt.plot(x_train, predicted, '--', label='Predictions', alpha=0.5)\n",
        "\n",
        "# Legend and plot\n",
        "plt.legend(loc='best')\n",
        "plt.show()"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": "<Figure size 432x288 with 1 Axes>",
            "image/png": "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\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "execution_count": 18,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:13:43.368Z",
          "iopub.execute_input": "2022-07-21T00:13:43.375Z",
          "iopub.status.idle": "2022-07-21T00:13:43.587Z",
          "shell.execute_reply": "2022-07-21T00:13:43.594Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "y_pred = model(torch.tensor([[22.290001]], dtype=torch.float32)).detach()\n",
        "y_pred.item()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 19,
          "data": {
            "text/plain": "22.67795753479004"
          },
          "metadata": {}
        }
      ],
      "execution_count": 19,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-07-21T00:21:20.045Z",
          "iopub.execute_input": "2022-07-21T00:21:20.052Z",
          "iopub.status.idle": "2022-07-21T00:21:20.067Z",
          "shell.execute_reply": "2022-07-21T00:21:20.078Z"
        }
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.6.13",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    },
    "kernelspec": {
      "argv": [
        "C:/Users/Tin Hang/Anaconda3\\python.exe",
        "-m",
        "ipykernel_launcher",
        "-f",
        "{connection_file}"
      ],
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "nteract": {
      "version": "0.28.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}